package day01_IO_JDBC.demo_JDBC_users.dao.Impl;

import day01_IO_JDBC.demo_JDBC_users.Entity.Users;
import day01_IO_JDBC.demo_JDBC_users.dao.UsersDao;
import day01_IO_JDBC.demo_JDBC_users.utils.DButils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public  class UsersDaoImpl implements UsersDao {
    /*
    * 完成注册功能
    * */

//    重写接口的 register方法
    @Override
    public boolean register(Users users) {
        Connection connection= DButils.getConnection();
        try {
            if (connection!=null){
                String user_name= users.getUser_name();
                String pwd= users.getPwd();
                String telphone= users.getTelphone();

/*          ①这是传统的写法，弊端：会被 sql注入
                Statement statement= connection.createStatement();
                String sql= " insert into user_info(user_name,pwd,telphone)"+
                        "values('"+user_name+"','"+pwd+"','"+telphone+"')";
                int num= statement.executeUpdate(sql);        //统计 insert into/ update/ delete 个数
                */

//          ②这是使用预处理 preparedStatement，防止sql注入
                String sql= " insert into user_info(user_name, pwd, telphone) value(?, ?, ?) ";
//                创建一个 PreparedStatement 对象，用于执行参数化的SQL语句
                PreparedStatement preparedStatement= connection.prepareStatement(sql);
//                设置参数
//                  设置第一个参数（索引从1开始），将 变量 作为参数传递给SQL语句
                preparedStatement.setString(1,user_name);
                preparedStatement.setString(2,pwd);
                preparedStatement.setString(3,telphone);

                int num = preparedStatement.executeUpdate();

                if (num>0){
                    return true;
                }
                else {
                    return false;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
//        关闭连接
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return false;
    }

//      重写接口的 update方法：
/*
* 完成 修改 功能
* */

    @Override
    public boolean update(Users users) {
        Connection connection= DButils.getConnection();

        try {
            if (connection!=null){
                String user_name= users.getUser_name();
                String pwd= users.getPwd();
                String telphone= users.getTelphone();
                int id= users.getId();

                String sql = " update user_info set user_name=?, pwd=?, telphone=? where id= ?";

//                创建对象执行sql语句
                PreparedStatement preparedStatement= connection.prepareStatement(sql);
                preparedStatement.setString(1,user_name);
                preparedStatement.setString(2,pwd);
                preparedStatement.setString(3,telphone);
//                这里需要加上 id的处理
                preparedStatement.setInt(4,id);

/*                int num= preparedStatement.executeUpdate(sql);
                在 update 方法中，你正确地使用了 PreparedStatement，但在执行时，executeUpdate 方法中传入了SQL字符串，
                而不是直接调用 executeUpdate()。这会导致 PreparedStatement 的占位符没有被正确替换，从而引发语法错误
                */
                int num= preparedStatement.executeUpdate();
                if (num>0){
                    return true;
                }
                else {
                    return false;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

//        关闭连接
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
}
